package prototypePattern

/**
 * 原型模式,其实就是使用Object提供的clone()克隆一个新的对象,这样比new一个对象效率更高些
 *
 * 模拟邮件群发,就像银行发送信用卡账单邮件一样,需要发送的用户量非常巨大,
 * 使用原型模式克隆一个对象的高效率就可以凸显出来,虽然邮件的内容基本一样,但是需要为每一个收件人创建一封新的邮件对象.
 * 参考如下示例:
 * 小A为了找女朋,同时给10个女孩子都写了一封信,每封信的内容完全一样(I love you),但是还是得写十封不同的信(信的对象不能复用,想象一下,如果复用的话会发生什么情况)
 *
 * java中Object提供的clone()方法采用的是“浅”克隆，即只复制关联对象的引用，(问题:使用浅克隆,当克隆一个集合的时候,克隆对象会对集合中的元素持有相同的
 * 引用,如果更改其中一个对象的集合元素的值,其他对象也会被修改)而不复制关联对象的数据。
 *
 * 如果要“深”克隆，则需要覆盖clone()方法，手动控制克隆的深度
 */

fun main() {

    ClientDemo().sendMails()
}

class ClientDemo {
    fun sendMails() {
        val mail = Mail(
            subject = "某商场双十一活动",
            content = "双十一,商品打折活动即将在双十一开启！！！"
        )

        for (i in 0 until 10) {
            val cloneMail = mail.cloneObj()
            cloneMail?.let {
                it.receiver = "用户${i}"
                PrintUtil.print("收件人：${it.receiver} \n标题：${it.subject} \n内容：${it.content}\n")
            }
        }
    }
}